物件.成員。然而當物件本身是null時,SpEL無法像Java語法一樣使用if來null check。?. 來避免NPE出現。#user?.role?.id == "R0001"。?. 前者的物件為null,呼叫後者成員時,不會拋出NPE,而是直接將該運算式回傳null。null == null 反而使運算式出現非預期性成立的情況發生!@Bean.方法(參數)。// 設置Bean名稱為ps
@Service("ps")
public class PermissionService {
private final RolePermissionDao rolePermissionDao;
@Autowired
public PermissionService(RolePermissionDao rolePermissionDao){
this.rolePermissionDao = rolePermissionDao;
}
public boolean hasPerm(PermissionCode permissionCode){
if (permissionCode == null) return false;
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
// null、principal check
if (authentication == null || !(authentication.getPrincipal() instanceof User user)) return false;
if (user.getRole() == null) return false;
return rolePermissionDao.existsByRoleAndPermissionId(user.getRole(), permissionCode.getCode());
}
}
AnonymousFilter,是當使用者打API時,沒有帶Jwt,表示訪客,此時就會將 "anonymousUser" 字串並放入Context中。因此要先檢查authentication帶有的Pricipal是不是User。@ps.hasPerm(T(org.system.enums.PermissionCode).GET_USERS_LIST))。T(Enum路徑).成員 來描述,因此寫成這樣。本篇文章出自《每天學Java直到今年結束》Day235,大家可以到我的網站上查看~